package com.xinke.edu.mypetadoption.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;

/**
 * SharedPreferences 工具类，封装常用操作
 */
public class SPUtils {

    // 默认的SP文件名（可在初始化时自定义）
    private static final String DEFAULT_SP_NAME = "app_sp";
    private static SPUtils instance;
    private SharedPreferences sp;
    private SharedPreferences.Editor editor;

    // 私有构造方法，避免外部实例化
    private SPUtils(Context context) {
        this(context, DEFAULT_SP_NAME);
    }

    private SPUtils(Context context, String spName) {
        if (TextUtils.isEmpty(spName)) {
            spName = DEFAULT_SP_NAME;
        }
        // 初始化SP（私有模式，仅当前应用可访问）
        sp = context.getApplicationContext().getSharedPreferences(spName, Context.MODE_PRIVATE);
        editor = sp.edit();
    }

    /**
     * 获取单例实例（使用默认SP文件名）
     * @param context 上下文
     * @return SPUtils实例
     */
    public static SPUtils getInstance(Context context) {
        if (instance == null) {
            synchronized (SPUtils.class) {
                if (instance == null) {
                    instance = new SPUtils(context);
                }
            }
        }
        return instance;
    }

    /**
     * 获取单例实例（自定义SP文件名）
     * @param context 上下文
     * @param spName SP文件名
     * @return SPUtils实例
     */
    public static SPUtils getInstance(Context context, String spName) {
        if (instance == null) {
            synchronized (SPUtils.class) {
                if (instance == null) {
                    instance = new SPUtils(context, spName);
                }
            }
        }
        return instance;
    }

    // ======= 存储数据 =======

    /**
     * 存储String类型数据
     * @param key 键
     * @param value 值
     */
    public void putString(String key, String value) {
        editor.putString(key, value).apply();
    }

    /**
     * 存储int类型数据
     * @param key 键
     * @param value 值
     */
    public void putInt(String key, int value) {
        editor.putInt(key, value).apply();
    }

    /**
     * 存储boolean类型数据
     * @param key 键
     * @param value 值
     */
    public void putBoolean(String key, boolean value) {
        editor.putBoolean(key, value).apply();
    }

    /**
     * 存储float类型数据
     * @param key 键
     * @param value 值
     */
    public void putFloat(String key, float value) {
        editor.putFloat(key, value).apply();
    }

    /**
     * 存储long类型数据
     * @param key 键
     * @param value 值
     */
    public void putLong(String key, long value) {
        editor.putLong(key, value).apply();
    }

    // ======= 获取数据 =======

    /**
     * 获取String类型数据
     * @param key 键
     * @param defaultValue 默认值（当key不存在时返回）
     * @return 存储的值或默认值
     */
    public String getString(String key, String defaultValue) {
        return sp.getString(key, defaultValue);
    }

    /**
     * 获取int类型数据（默认值为0）
     * @param key 键
     * @return 存储的值或0
     */
    public int getInt(String key) {
        return getInt(key, 0);
    }

    /**
     * 获取int类型数据
     * @param key 键
     * @param defaultValue 默认值
     * @return 存储的值或默认值
     */
    public int getInt(String key, int defaultValue) {
        return sp.getInt(key, defaultValue);
    }

    /**
     * 获取boolean类型数据（默认值为false）
     * @param key 键
     * @return 存储的值或false
     */
    public boolean getBoolean(String key) {
        return getBoolean(key, false);
    }

    /**
     * 获取boolean类型数据
     * @param key 键
     * @param defaultValue 默认值
     * @return 存储的值或默认值
     */
    public boolean getBoolean(String key, boolean defaultValue) {
        return sp.getBoolean(key, defaultValue);
    }

    /**
     * 获取float类型数据（默认值为0f）
     * @param key 键
     * @return 存储的值或0f
     */
    public float getFloat(String key) {
        return getFloat(key, 0f);
    }

    /**
     * 获取float类型数据
     * @param key 键
     * @param defaultValue 默认值
     * @return 存储的值或默认值
     */
    public float getFloat(String key, float defaultValue) {
        return sp.getFloat(key, defaultValue);
    }

    /**
     * 获取long类型数据（默认值为0L）
     * @param key 键
     * @return 存储的值或0L
     */
    public long getLong(String key) {
        return getLong(key, 0L);
    }

    /**
     * 获取long类型数据
     * @param key 键
     * @param defaultValue 默认值
     * @return 存储的值或默认值
     */
    public long getLong(String key, long defaultValue) {
        return sp.getLong(key, defaultValue);
    }

    // ======= 其他操作 =======

    /**
     * 判断key是否存在
     * @param key 键
     * @return true：存在；false：不存在
     */
    public boolean contains(String key) {
        return sp.contains(key);
    }

    /**
     * 删除指定key的数据
     * @param key 键
     */
    public void remove(String key) {
        editor.remove(key).apply();
    }

    /**
     * 清除当前SP文件中的所有数据
     */
    public void clear() {
        editor.clear().apply();
    }
}
